#!/bin/bash
# PWM测试程序自动化构建脚本
# 支持多平台编译和自动化构建流程

# 脚本配置
SCRIPT_NAME=$(basename "$0")
PROJECT_NAME="PWM测试程序"
VERSION="1.0.0"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 编译器检查函数
check_compiler() {
    local compiler=$1
    if command -v "$compiler" >/dev/null 2>&1; then
        echo -e "${GREEN}✓${NC} $compiler 可用"
        return 0
    else
        echo -e "${RED}✗${NC} $compiler 不可用"
        return 1
    fi
}

# 打印带颜色的信息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
$PROJECT_NAME 构建脚本 v$VERSION

用法: $SCRIPT_NAME [选项]

选项:
  gcc       - 使用GCC编译本地版本
  arm       - 使用ARM交叉编译器编译
  riscv64   - 使用RISC-V 64位交叉编译器编译
  all       - 编译所有支持的平台
  clean     - 清理所有编译产物
  debug     - 编译调试版本
  test      - 运行测试（需要硬件支持）
  check     - 检查编译环境和代码语法
  install   - 安装到系统
  -h, --help - 显示此帮助信息

示例:
  $SCRIPT_NAME gcc      # 编译本地版本
  $SCRIPT_NAME all      # 编译所有平台版本
  $SCRIPT_NAME clean    # 清理编译文件
  $SCRIPT_NAME debug    # 编译调试版本

支持的编译器:
  - gcc (本地编译)
  - arm-nextvpu-linux-gnueabihf-gcc (ARM架构)
  - riscv64-anyka-linux-musl-gcc (RISC-V 64位)

EOF
}

# 检查编译环境
check_environment() {
    print_info "检查编译环境..."
    
    local gcc_ok=0
    local arm_ok=0
    local riscv64_ok=0
    
    # 检查GCC
    if check_compiler "gcc"; then
        gcc_ok=1
    fi
    
    # 检查ARM交叉编译器
    if check_compiler "arm-nextvpu-linux-gnueabihf-gcc"; then
        arm_ok=1
    fi
    
    # 检查RISC-V交叉编译器
    if check_compiler "riscv64-anyka-linux-musl-gcc"; then
        riscv64_ok=1
    fi
    
    # 检查Make
    if ! check_compiler "make"; then
        print_error "make工具不可用，无法继续编译"
        exit 1
    fi
    
    # 统计可用编译器
    local available_count=$((gcc_ok + arm_ok + riscv64_ok))
    print_info "可用编译器数量: $available_count/3"
    
    if [ $available_count -eq 0 ]; then
        print_error "没有可用的编译器，请安装至少一个编译器"
        exit 1
    fi
    
    return 0
}

# 编译指定目标
build_target() {
    local target=$1
    local compiler_name=$2
    
    print_info "开始编译 $target ($compiler_name)..."
    
    if make "$target" 2>&1; then
        print_success "$target 编译完成"
        return 0
    else
        print_error "$target 编译失败"
        return 1
    fi
}

# 清理编译产物
clean_build() {
    print_info "清理编译产物..."
    
    if make clean 2>&1; then
        print_success "清理完成"
        return 0
    else
        print_error "清理失败"
        return 1
    fi
}

# 运行测试
run_test() {
    print_info "运行测试..."
    print_warning "注意：PWM测试需要root权限和实际硬件支持"
    
    if [ ! -f "pwm_test" ]; then
        print_warning "本地版本不存在，先编译..."
        if ! build_target "pwm_test" "gcc"; then
            return 1
        fi
    fi
    
    # 检查是否有root权限
    if [ "$EUID" -ne 0 ]; then
        print_warning "建议使用root权限运行PWM测试"
    fi
    
    # 运行信息查询测试
    print_info "运行PWM设备信息查询..."
    if ./pwm_test --info; then
        print_success "PWM设备信息查询成功"
    else
        print_warning "PWM设备信息查询失败（可能是硬件不支持）"
    fi
    
    return 0
}

# 代码语法检查
check_syntax() {
    print_info "检查代码语法..."
    
    if make check 2>&1; then
        print_success "代码语法检查通过"
        return 0
    else
        print_error "代码语法检查失败"
        return 1
    fi
}

# 安装程序
install_program() {
    print_info "安装程序到系统..."
    
    if [ "$EUID" -ne 0 ]; then
        print_error "安装需要root权限，请使用sudo运行"
        return 1
    fi
    
    if make install 2>&1; then
        print_success "程序安装完成"
        return 0
    else
        print_error "程序安装失败"
        return 1
    fi
}

# 主函数
main() {
    local action=${1:-"gcc"}
    local build_failed=0
    
    # 显示欢迎信息
    echo -e "${BLUE}========================================${NC}"
    echo -e "${BLUE}$PROJECT_NAME 构建脚本 v$VERSION${NC}"
    echo -e "${BLUE}========================================${NC}"
    
    case "$action" in
        gcc)
            check_environment
            build_target "pwm_test" "GCC"
            ;;
        arm)
            check_environment
            if ! check_compiler "arm-nextvpu-linux-gnueabihf-gcc"; then
                print_error "ARM交叉编译器不可用"
                exit 1
            fi
            build_target "arm" "ARM交叉编译器"
            ;;
        riscv64)
            check_environment
            if ! check_compiler "riscv64-anyka-linux-musl-gcc"; then
                print_error "RISC-V交叉编译器不可用"
                exit 1
            fi
            build_target "riscv64" "RISC-V 64位交叉编译器"
            ;;
        all)
            check_environment
            print_info "编译所有支持的平台..."
            
            # GCC编译
            if check_compiler "gcc"; then
                if ! build_target "pwm_test" "GCC"; then
                    build_failed=1
                fi
            fi
            
            # ARM编译
            if check_compiler "arm-nextvpu-linux-gnueabihf-gcc"; then
                if ! build_target "arm" "ARM交叉编译器"; then
                    build_failed=1
                fi
            fi
            
            # RISC-V编译
            if check_compiler "riscv64-anyka-linux-musl-gcc"; then
                if ! build_target "riscv64" "RISC-V 64位交叉编译器"; then
                    build_failed=1
                fi
            fi
            
            if [ $build_failed -eq 0 ]; then
                print_success "所有平台编译完成"
            else
                print_warning "部分平台编译失败，请检查错误信息"
            fi
            ;;
        clean)
            clean_build
            ;;
        debug)
            check_environment
            build_target "debug" "GCC调试版本"
            ;;
        test)
            check_environment
            run_test
            ;;
        check)
            check_environment
            check_syntax
            ;;
        install)
            install_program
            ;;
        -h|--help|help)
            show_help
            ;;
        *)
            print_error "未知选项: $action"
            echo
            show_help
            exit 1
            ;;
    esac
    
    echo -e "${BLUE}========================================${NC}"
    if [ $build_failed -eq 0 ]; then
        print_success "构建脚本执行完成"
    else
        print_warning "构建脚本执行完成，但有错误发生"
        exit 1
    fi
}

# 捕获Ctrl+C信号
trap 'echo -e "\n${YELLOW}构建被用户中断${NC}"; exit 130' INT

# 执行主函数
main "$@"